/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.myapp.model.DAO.Notifications;

import com.myapp.model.DAO.HibernateUtil;
import com.myapp.model.DAO.states.EstadosDao;
import com.myapp.model.mensajes.Mensajes;
import com.myapp.model.usuarios.Usuarios;
import com.myapp.model.estados.Estados;
import com.myapp.model.notificaciones.Notificaciones;
import com.myapp.model.tipos.Tipos;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.criterion.CriteriaSpecification;
import org.hibernate.criterion.Restrictions;

public class NotificationsDao {

    /**
     * Metodo sendNotifications, se le pasa el tipo de notificacion "n", donde
     * va solo el usuario que la emite y el tipo de notificacion (no es
     * necesario ni el estado ni la fecha actual, de eso ya se encarga el
     * metodo), y lista de usuarios a la que va enviada "lu".
     *
     * @param n
     * @param lu
     */
    public void sendNotifications(Notificaciones n, List<Usuarios> lu) {
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        try {
            for (Usuarios u : lu) {
                session.beginTransaction();
                n.setUsuariosByIdreceptor(u);
                Estados e = new Estados();
                e.setIdestado((byte) 10);
                n.setEstados(e);
                n.setFecha(new Date());
                session.save(n);
                session.getTransaction().commit();
            }
        } catch (Exception ex) {
            System.out.println(ex);
            session.getTransaction().rollback();
        } finally {
            if (session.isOpen() && session.getTransaction().isActive()) {
                session.getTransaction().commit();
            }
        }
    }

    public List<Notificaciones> listNotifications(Usuarios u) {
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        List<Notificaciones> notificaciones = new ArrayList();
        Estados e = new Estados();
        e.setIdestado((byte) 10);
        try {
            //Comenzar la transacción 
            session.beginTransaction();
            notificaciones = session.createCriteria(Notificaciones.class).
                    createAlias("usuariosByIdemisor", "us", CriteriaSpecification.LEFT_JOIN).
                    createAlias("tipos", "tp", CriteriaSpecification.LEFT_JOIN).
                    add(Restrictions.eq("usuariosByIdreceptor", u)).
                    add(Restrictions.eq("estados", e)).list();
            //Confirmar transacción 
            session.getTransaction().commit();
        } catch (Exception ex) {
            System.out.println(ex);
            session.getTransaction().rollback();
        } finally {
            if (session.isOpen() && session.getTransaction().isActive()) {
                session.getTransaction().commit();
            }
            return notificaciones;
        }
    }

    public List counterNotifications(Usuarios u) {
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        List contador = new ArrayList();
        String valor = null;
        String hql = null;
        try {
            //Comenzar la transacción 
            session.beginTransaction();
            hql = "select count(*) from Notificaciones n where usuariosByIdreceptor=" + u.getIdusuario() + " and tipos<3 and estados=10";
            valor = session.createQuery(hql).uniqueResult().toString();
            contador.add(valor);
            hql = "select count(*) from Notificaciones n where usuariosByIdreceptor=" + u.getIdusuario() + " and tipos=3 and estados=10";
            valor = session.createQuery(hql).uniqueResult().toString();
            contador.add(valor);
            hql = "select count(*) from Notificaciones n where usuariosByIdreceptor=" + u.getIdusuario() + " and tipos>5 and estados=10";
            valor = session.createQuery(hql).uniqueResult().toString();
            contador.add(valor);
            //Confirmar transacción 
            session.getTransaction().commit();
        } catch (Exception ex) {
            System.out.println(ex);
            session.getTransaction().rollback();
        } finally {
            if (session.isOpen() && session.getTransaction().isActive()) {
                session.getTransaction().commit();
            }
            return contador;
        }
    }

    public void changeStateNotifications(List<Notificaciones> ln, Tipos t) {
        Estados e = new Estados();
        e.setIdestado((byte) 11);
        for (Notificaciones n : ln) {
            if (t.getIdtipo() < 3 && n.getTipos().getIdtipo() < 3) {
                EstadosDao edao = new EstadosDao();
                edao.changeState(n, e);
            }
            if (t.getIdtipo() > 5 && n.getTipos().getIdtipo() > 5) {
                EstadosDao edao = new EstadosDao();
                edao.changeState(n, e);
            }
        }
    }

    public void changeStateMessageNotifications(List<Notificaciones> ln, Mensajes m) {
        Estados e = new Estados();
        e.setIdestado((byte) 11);
        int i;
        for (Notificaciones n : ln) {
            i = m.getFecha().compareTo(n.getFecha());
            if (i == 0 && n.getTipos().getIdtipo() == 3) {
                EstadosDao edao = new EstadosDao();
                edao.changeState(n, e);
            }
        }
    }
}
